/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package model.entity;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.List;

import javax.persistence.Basic;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlTransient;

import model.entity.relatorio.RespostaPontuacao;

import org.hibernate.annotations.LazyCollection;
import org.hibernate.annotations.LazyCollectionOption;

/**
 *
 * @author Alex
 */
@Entity
@Table(catalog = "nasa", schema = "")
@XmlRootElement
@NamedQueries({
    @NamedQuery(name = "Grupo.findAll", query = "SELECT g FROM Grupo g"),
    @NamedQuery(name = "Grupo.findByGrupoId", query = "SELECT g FROM Grupo g WHERE g.grupoId = :grupoId"),
    @NamedQuery(name = "Grupo.findByGrupoNome", query = "SELECT g FROM Grupo g WHERE g.grupoNome = :grupoNome"),
    @NamedQuery(name = "Grupo.findByGrupoDescricao", query = "SELECT g FROM Grupo g WHERE g.grupoDescricao = :grupoDescricao"),
    @NamedQuery(name = "Grupo.findByGrupodataCriacao", query = "SELECT g FROM Grupo g WHERE g.grupodataCriacao = :grupodataCriacao")})
public class Grupo implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "grupo_id", nullable = false)
    private Integer grupoId;
    @Basic(optional = false)
    @Column(name = "grupo_nome", nullable = false, length = 45)
    private String grupoNome;
    @Column(name = "grupo_descricao", length = 45)
    private String grupoDescricao;
    @Basic(optional = false)
    @Column(name = "grupo_dataCriacao", nullable = false)
    @Temporal(TemporalType.TIMESTAMP)
    private Date grupodataCriacao;
    @JoinTable(name = "grupo_participante", joinColumns = {
        @JoinColumn(name = "grupo_id", referencedColumnName = "grupo_id", nullable = false)}, inverseJoinColumns = {
        @JoinColumn(name = "part_email", referencedColumnName = "part_email", nullable = false)})
    @ManyToMany
    @LazyCollection(LazyCollectionOption.FALSE)
    private List<Participante> participanteList;
    @JoinTable(name = "grupo_questionario", joinColumns = {
        @JoinColumn(name = "grupo_id", referencedColumnName = "grupo_id", nullable = false)}, inverseJoinColumns = {
        @JoinColumn(name = "quest_id", referencedColumnName = "quest_id", nullable = false)})
    @ManyToMany
    @LazyCollection(LazyCollectionOption.FALSE)
    private List<Questionario> questionarioList;
    @JoinColumn(name = "grupo_psicologo", referencedColumnName = "psic_id", nullable = false)
    @ManyToOne(optional = false)
    private Psicologo grupoPsicologo;
    @OneToMany(mappedBy = "resultGrupo")
    @LazyCollection(LazyCollectionOption.FALSE)
    private List<Resultado> resultadoList;

    public Grupo() {
    }

    public Grupo(Integer grupoId) {
        this.grupoId = grupoId;
    }

    public Grupo(Integer grupoId, String grupoNome, Date grupodataCriacao) {
        this.grupoId = grupoId;
        this.grupoNome = grupoNome;
        this.grupodataCriacao = grupodataCriacao;
    }

    public Integer getGrupoId() {
        return grupoId;
    }

    public void setGrupoId(Integer grupoId) {
        this.grupoId = grupoId;
    }

    public String getGrupoNome() {
        return grupoNome;
    }

    public void setGrupoNome(String grupoNome) {
        this.grupoNome = grupoNome;
    }

    public String getGrupoDescricao() {
        return grupoDescricao;
    }

    public void setGrupoDescricao(String grupoDescricao) {
        this.grupoDescricao = grupoDescricao;
    }

    public Date getGrupodataCriacao() {
        return grupodataCriacao;
    }

    public void setGrupodataCriacao(Date grupodataCriacao) {
        this.grupodataCriacao = grupodataCriacao;
    }

    @XmlTransient
    public List<Participante> getParticipanteList() {
        return participanteList;
    }

    public void setParticipanteList(List<Participante> participanteList) {
        this.participanteList = participanteList;
    }

    @XmlTransient
    public List<Questionario> getQuestionarioList() {
        return questionarioList;
    }

    public void setQuestionarioList(List<Questionario> questionarioList) {
        this.questionarioList = questionarioList;
    }

    public Psicologo getGrupoPsicologo() {
        return grupoPsicologo;
    }

    public void setGrupoPsicologo(Psicologo grupoPsicologo) {
        this.grupoPsicologo = grupoPsicologo;
    }

    @XmlTransient
    public List<Resultado> getResultadoList() {
        return resultadoList;
    }

    public void setResultadoList(List<Resultado> resultadoList) {
        this.resultadoList = resultadoList;
    }

    @Override
    public int hashCode() {
        int hash = 0;
        hash += (grupoId != null ? grupoId.hashCode() : 0);
        return hash;
    }
    
    public int getQtdeParticipantesNoLimiar(){
    	int quantidade = 0;
    	for (Resultado resultado : this.resultadoList){
			if (resultado.getTotal() <= 60)
				quantidade++;
    	}
    	return quantidade;
    }
    
    public int getQtdeParticipantesComCargaExcessiva(){
    	int quantidade = 0;
    	for (Resultado resultado : this.resultadoList){
			if (resultado.getTotal() > 60)
				quantidade++;
    	}
    	return quantidade;
    }
    
    public List<Resultado> resultadosNoLimiarCrescente(){
    	List<Resultado> resultadosNoLimiar = new ArrayList<Resultado>();
    	for (Resultado resultado : this.resultadoList){
			if (resultado.getTotal() <= 60)
				resultadosNoLimiar.add(resultado);
    	}
    	Collections.sort(resultadosNoLimiar);
    	return resultadosNoLimiar;
    }
    
    public List<Resultado> resultadosComCargaExcessivaCrescente(){
    	List<Resultado> resultadosComCargaExcessiva = new ArrayList<Resultado>();
    	for (Resultado resultado : this.resultadoList){
			if (resultado.getTotal() > 60)
				resultadosComCargaExcessiva.add(resultado);
    	}
    	Collections.sort(resultadosComCargaExcessiva);
    	return resultadosComCargaExcessiva;
    }
    
    public String getParticipantesNoLimiarCrescente(){
    	List<Resultado> resultadosNoLimiar = resultadosNoLimiarCrescente();
    	String participantesNoLimiarCrescente = "";
    	for (Resultado resultado : resultadosNoLimiar) {
			participantesNoLimiarCrescente += resultado.getResultParticipante().getPartNome() + ", ";
		}
    	return (participantesNoLimiarCrescente.equals("")) ? "" : participantesNoLimiarCrescente.substring(0, participantesNoLimiarCrescente.length() - 2);
    }
    
    public String getParticipantesComCargaExcessivaCrescente(){
    	List<Resultado> resultadosComCargaExcessiva = resultadosComCargaExcessivaCrescente();
    	String participantesComCargaExcessivaCrescente = "";
    	for (Resultado resultado : resultadosComCargaExcessiva) {
			participantesComCargaExcessivaCrescente += resultado.getResultParticipante().getPartNome() + ", ";
		}
    	return (participantesComCargaExcessivaCrescente.equals("")) ? "" : participantesComCargaExcessivaCrescente.substring(0, participantesComCargaExcessivaCrescente.length() - 2);
    }
    
    public RespostaPontuacao getMaiorCargaGeral() {
    	List<RespostaPontuacao> totais = getRespostasPontuacao();
    	return totais.get(0);
    }
    
    public List<RespostaPontuacao> getCargasOrdenadas() {
    	List<RespostaPontuacao> totais = getRespostasPontuacao();
    	return totais;
    }

	private List<RespostaPontuacao> getRespostasPontuacao() {
		Integer totalDemandaMental = 0;
    	Integer totalDemandaFisica = 0;
    	Integer totalDemandaTemporal = 0;
    	Integer totalPerformance = 0;
    	Integer totalEsforco = 0;
    	Integer totalFrustracao = 0;
    	
    	for (Resultado resultado : resultadoList) {
    		totalDemandaMental += resultado.getPontuacaoDemandaMental();
    		totalDemandaFisica += resultado.getPontuacaoDemandaFisica();
        	totalDemandaTemporal += resultado.getPontuacaoDemandaTemporal();
        	totalPerformance += resultado.getPontuacaoPerformance();
        	totalEsforco += resultado.getPontuacaoEsforco();
        	totalFrustracao += resultado.getPontuacaoFrustracao();
		}
    	
    	List<RespostaPontuacao> totais = new ArrayList<RespostaPontuacao>();
    	totais.add(new RespostaPontuacao(0, totalDemandaMental));
    	totais.add(new RespostaPontuacao(1, totalDemandaFisica));
    	totais.add(new RespostaPontuacao(2, totalDemandaTemporal));
    	totais.add(new RespostaPontuacao(3, totalPerformance));
    	totais.add(new RespostaPontuacao(4, totalEsforco));
    	totais.add(new RespostaPontuacao(5, totalFrustracao));
    	
    	Collections.sort(totais);
		return totais;
	}

    @Override
    public boolean equals(Object object) {
        // TODO: Warning - this method won't work in the case the id fields are not set
        if (!(object instanceof Grupo)) {
            return false;
        }
        Grupo other = (Grupo) object;
        if ((this.grupoId == null && other.grupoId != null) || (this.grupoId != null && !this.grupoId.equals(other.grupoId))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "entidades.Grupo[ grupoId=" + grupoId + " ]";
    }
    
}
